package utils

import (
	"errors"
	"fmt"
	"github.com/golang-jwt/jwt/v5"
	"gochat/common/enums"
	"time"
)

// Claims 定义 Token 中包含的信息
type Claims struct {
	UserID string `json:"user_id"`
	jwt.RegisteredClaims
}

// GenerateToken 生成 JWT Token
func GenerateToken(userID string) (string, error) {
	// 设置 Token 的过期时间，这里设置为 24 小时
	expirationTime := time.Now().Add(time.Hour * 24 * 30)
	// 创建 Claims 对象
	claims := &Claims{
		UserID: userID,
		RegisteredClaims: jwt.RegisteredClaims{
			// 设置过期时间
			ExpiresAt: jwt.NewNumericDate(expirationTime),
			// 设置发行时间
			IssuedAt: jwt.NewNumericDate(time.Now()),
			// 设置发行人
			Issuer: "年年",
		},
	}

	// 创建一个新的 Token 对象，指定签名方法为 HS256
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	// 使用密钥对 Token 进行签名
	secret := []byte(enums.TOKEN_SECRET)
	tokenString, err := token.SignedString(secret)
	if err != nil {
		return "", err
	}

	return tokenString, nil
}

// ValidateToken 验证 JWT Token
func ValidateToken(tokenString string) (*Claims, error) {
	// 解析 Token
	claims := &Claims{}
	tkn, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
		// 验证签名方法
		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
			return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
		}
		return []byte(enums.TOKEN_SECRET), nil

	})

	if err != nil {
		return nil, err
	}

	if !tkn.Valid {
		return nil, errors.New("invalid token")
	}

	return claims, nil
}
